#include <iostream>
#include <cstring>
#include <cstdlib>
#include <vector>
using namespace std;


/*

就是在成员中有指针时默认的拷贝构造函数是浅复制，就会导致两个指针指向同一块内存，这样在第一个对象在析构时就会释放指针，
从而导致拷贝的对象中的指针成了空悬指针，且第二个对象析构时其指针已经被释放，所以便有可能出现delete两次的情况，这是当然是一个巨大的错误。

其实我们的移动构造函数就比较像这个问题，不过移动构造函数省去了其他成员的复制，
直接把所有成员的管理权转交给了复制的对象，也就是说不仅是指针，
被复制对象的所有成员操作权转移到了复制对象的身上，这样就省去了拷贝的时间与资源，从而达到提升效率的问题，这就是移动构造函数的初衷。
*/
namespace moveDemo
{


class Str{
public:
    char *str;
    Str(char value[])
    {
        cout<<"普通构造函数..."<<endl;
        str = NULL;
        int len = strlen(value);
        str = (char *)malloc(len + 1);
        memset(str,0,len + 1);
        strcpy(str,value);
    }
    Str(const Str &s)
    {
        cout<<"拷贝构造函数..."<<endl;
        str = NULL;
        int len = strlen(s.str);
        str = (char *)malloc(len + 1);
        memset(str,0,len + 1);
        strcpy(str,s.str);
    }
    Str(Str &&s)
    {
        cout<<"移动构造函数..."<<endl;
        str = NULL;
        str = s.str;
        s.str = NULL;
    }
    ~Str()
    {
        cout<<"析构函数"<<endl;
        if(str != NULL)
        {
            free(str);
            str = NULL;
        }
    }
};
/*
void demo()
    {
        char value[] = "I love zx";
        Str s(value);//对象仍旧存在　但是值已经在vector中
        vector<Str> vs;
        vs.push_back(std::move(s));//左值转换成右值
        //vs.push_back(s);
        cout<<vs[0].str<<endl;
        if(s.str != NULL)
            cout<<s.str<<endl;
    }
*/
}
